// ts 是js超集
//7.函数
//7.1 声明式函数 参数设置数据类型 返回值也可以设置数据类型，
//不设定的时候 默认式any类型
function run(speed:number,unit:string):string{
    return "宝马的速度"+speed+""+unit;
}
run(100,'km/h');
let n1:string=run(10,"m/s");
// let n2:number=run(20,'m/s');//Error 返回值式string
// run(1,1); //Error  unit是string
//7.2 可选参数 ?
function say(username:string,text?:string):string{
    return username+text;
}
say('tom','talking');
say('jerry');
// say();//Error username是必填参数
//7.3 默认参数
function buy(name:string,price:number=9.9):void{
    //函数没有返回值 是void
}
buy('香蕉');//price就有默认值 
buy("芒果",10);
//7.4 剩余运算   ...剩余运算 
function addnum(a:number,b:number,...othernum:number[]):number{
    return a+b;
}
addnum(10,20);
// 除了 10 20赋值给形参a ,b  剩下的30 40 50 赋值给剩余参数 othernum
addnum(10,20,30,40,50);
let arr5:number[]=[10,11,12,3];
let arr6:number[]=[...arr5];//... 展开运算
//7.5 函数重载  通过传入不同的参数数据类型 或个数 函数执行的不同的代码
// function addn(a:number,b:number):number{
//     return a+b;
// }
// function addstr(a:string,b:string):string{
//     return String(a+b).trim();//去除首位空格
// }
//这里只有两个重载.
function addn(a:number,b:number):number;
function addn(a:string,b:string):string;
function addn(a:any,b:any):any{//函数重载的实现代码
    if(typeof a==='number'){//根据不同的参数 实现不同业务逻辑
        return a+b;
    }else if(typeof a=='string'){
        return String(a+b).trim();
    }else{
        return a&&b;
    }
}
addn(10,30);
addn('hello','赵家兴');
//function addn(a:boolean,b:boolean):boolean;
// addn(true,true); //错误的. 函数重载只有两个重载 要么全是字符串 要么全是数字
//7.6 函数表达式
// let eat=function(){}
// let eat=()=>{}
//(1).直接在函数表达式里面写参数 和 返回值
let eat1=(name:string,food:string='馒头'):string=>{
    return name+"的早餐吃得"+food;
}
let eat2=function(name:string,food:string='馒头'):string{
    return name+"的早餐吃得"+food;
}
//(2).表达式后面 声明函数类型
type EatFun=(name:string,food:string)=>string;
let eat3:EatFun=function(name,food){
    return name+"的早餐吃了"+food;
}
let str2:string=eat3('小明','包子');
// let str3:number=eat3('小明','包子');
// eat3('小王',9);
//合并写法
let eat5: (name:string,food:string)=>string  =  (name,food):string=>{
    return name+"的早餐吃了"+food; 
}
// eat5(10,20);//Error 参数数据类型错误
// let e5:number=eat5('小王','肠粉'); //返回值是string